﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;


namespace TamGiac
{
    /// <summary>
    /// Lớp xử lý
    /// </summary>
    class _0912218_LopTamGiac
    {   
        /// <summary>
        /// Hàm tính khoảng cách 2 điểm
        /// </summary>
        /// <param name="d01">Điểm thứ nhất</param>
        /// <param name="d02">Điểm thứ hai</param>
        /// <returns>Khoảng cách giữa 2 điểm</returns>
        public double TinhKhoangCach(Diem d01, Diem d02)
        {
            double ketqua = 0;
            double deltaX = Math.Pow( d01.X - d02.X, 2 );
            double deltaY = Math.Pow( d01.Y - d02.Y, 2 );

            ketqua = Math.Sqrt( deltaX + deltaY );

            return ketqua;
        }

        /// <summary>
        /// Hàm kiểm tra tam giác?
        /// </summary>
        /// <param name="tg">Tam giác cần kiểm tra</param>
        /// <returns>true: là tam giác || false: không là tam giác</returns>
        public bool KiemTraTamGiac(TamGiac tg)
        {
            if (tg.Type == 1)
            {
                double canh01 = TinhKhoangCach(tg.Diem1, tg.Diem2);
                double canh02 = TinhKhoangCach(tg.Diem2, tg.Diem3);
                double canh03 = TinhKhoangCach(tg.Diem1, tg.Diem3);

                if (batDangThuc(canh01, canh02, canh03))
                    return true;
            } else
            {
                if (batDangThuc(tg.Canh1, tg.Canh2, tg.Canh3))
                    return true;
            }

            return false;
        }

        /// <summary>
        /// Hàm xác định loại tam giác
        /// </summary>
        /// <param name="tg">Tam giác cần xác định</param>
        /// <returns>0: thường || 1: cân || 2: vuông || 3: đều</returns>
        public int XacDinhLoaiTamGiac(TamGiac tg)
        {
            if (laTamGiacCan(tg) && !laTamGiacDeu(tg))
                return 1;

            if (laTamGiacVuong(tg))
                return 2;

            if (laTamGiacDeu(tg))
                return 3;

            return 0;
        }

        /// <summary>
        /// Hàm xác định là tam giác vuông
        /// </summary>
        /// <param name="tg">Tam giác cần kiểm tra</param>
        /// <returns>true: tam giác vuông || false: không phải</returns>
        public bool laTamGiacVuong(TamGiac tg)
        {
            List<double> canh = new List<double>();

            if (tg.Type == 1)
            {
                double canh01 = TinhKhoangCach(tg.Diem1, tg.Diem2);
                double canh02 = TinhKhoangCach(tg.Diem2, tg.Diem3);
                double canh03 = TinhKhoangCach(tg.Diem1, tg.Diem3);

                canh.Add(canh01);
                canh.Add(canh02);
                canh.Add(canh03);
            } else
            {
                canh.Add(tg.Canh1);
                canh.Add(tg.Canh2);
                canh.Add(tg.Canh3);
            }

            canh.Sort();

            if (Math.Pow(canh[2], 2) == Math.Pow(canh[0], 2) + Math.Pow(canh[1], 2))
                return true;

            return false;
        }

        /// <summary>
        /// Hàm xác định là tam giác cân
        /// </summary>
        /// <param name="tg">Tam giác cần kiểm tra</param>
        /// <returns>true: tam giác cân || false: không phải</returns>
        public bool laTamGiacCan(TamGiac tg)
        {
            if (tg.Type == 1)
            {
                double canh01 = TinhKhoangCach(tg.Diem1, tg.Diem2);
                double canh02 = TinhKhoangCach(tg.Diem2, tg.Diem3);
                double canh03 = TinhKhoangCach(tg.Diem1, tg.Diem3);

                if (canh01 == canh02 || canh02 == canh03 || canh01 == canh03)
                    return true;
            } else
            {
                if (tg.Canh1 == tg.Canh2 || tg.Canh2 == tg.Canh3 || tg.Canh1 == tg.Canh3)
                    return true;
            }

            return false;
        }

        /// <summary>
        /// Hàm xác định là tam giác đều
        /// </summary>
        /// <param name="tg">Tam giác cần kiểm tra</param>
        /// <returns>true: tam giác đều || false: không phải</returns>
        public bool laTamGiacDeu(TamGiac tg)
        {
            if (tg.Type == 1)
            {
                double canh01 = TinhKhoangCach(tg.Diem1, tg.Diem2);
                double canh02 = TinhKhoangCach(tg.Diem2, tg.Diem3);
                double canh03 = TinhKhoangCach(tg.Diem1, tg.Diem3);

                if (canh01 == canh02 && canh02 == canh03)
                    return true;
            } else
            {
                if (tg.Canh1 == tg.Canh2 && tg.Canh2 == tg.Canh3)
                    return true;
            }            

            return false;
        }

        /// <summary>
        /// Hàm kiểm tra bất đẳng thức 3 số
        /// </summary>
        /// <param name="c01">Độ dài cạnh 1</param>
        /// <param name="c02">Độ dài cạnh 2</param>
        /// <param name="c03">Độ dài cạnh 3</param>
        /// <returns>true: thỏa || false: không thỏa</returns>
        public bool batDangThuc(double c01, double c02, double c03)
        {
            if (c01 < c02 + c03 && c02 < c01 + c03 && c03 < c01 + c02)
                return true;

            return false;
        }

        /// <summary>
        /// Hàm tìm số bội để phóng to tam giác
        /// </summary>
        /// <param name="lst">Mảng các tọa độ của đỉnh tam giác</param>
        /// <returns>Số bội cần tìm</returns>
        public int soNhan(List<int> lst)
        {
            lst.Sort();

            for (int i = 0; i < 100; i++)
            {
                if (lst[5] * i > 200)
                {
                    return i--;
                }
            }

            return 0;
        }

        //
        public List<Point> taoDiem(TamGiac tg)
        {
            List<Point> mangDiem = new List<Point>();

            mangDiem.Add(new Point(0, 0));
            mangDiem.Add(new Point(Convert.ToInt32(tg.Canh1), 0));

            int X = Convert.ToInt32((Math.Pow(tg.Canh2, 2) - Math.Pow(tg.Canh3, 2) + Math.Pow(tg.Canh1, 2)) / (2 * tg.Canh1));
            int Y = Convert.ToInt32(Math.Sqrt(Math.Pow(tg.Canh2, 2) - Math.Pow(X, 2)));

            mangDiem.Add(new Point(X, Y));

            return mangDiem;
        }
    }
}                                        